//!
/**
 ***********************************************************************************************************
 * <RBD3D9VertexBuffer Implementation>
 ***********************************************************************************************************
 * @file RBD3D9VertexBuffer.cpp
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Precompiled Header
 ***********************************************************************************************************/
#include "RBD3D9RendererPCH.h"

/***********************************************************************************************************
 * Includes
 ***********************************************************************************************************/
#include "RBD3D9VertexBuffer.h"
#include "RBD3D9Renderer.h"
#include "RBD3D9Tools.h"

/***********************************************************************************************************
 * Defines
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Classes implementation
 ***********************************************************************************************************/

/**
 ***********************************************************************************************************
 * Constructor
 ***********************************************************************************************************/
RBD3D9VertexBuffer::RBD3D9VertexBuffer(uint32 uiUsage, uint32 uiVertexSize, RBHardwareBufferManager* pCreator, uint32 uiVertexCount, const void* pInitData)
: RBVertexBuffer(uiUsage, MP_GPU | MP_CPU, pCreator, uiVertexSize, uiVertexCount)
, m_pD3DVB(NULL)
{
    m_pData = malloc(uiVertexCount*uiVertexSize);
    memcpy_s(m_pData, uiVertexCount*uiVertexSize, pInitData, uiVertexCount*uiVertexSize);

    Create();
}

/**
 ***********************************************************************************************************
 * Destructor
 ***********************************************************************************************************/
RBD3D9VertexBuffer::~RBD3D9VertexBuffer()
{
    RBCommon::SafeRelease(m_pD3DVB);
    free(m_pData);
}

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
void* RBD3D9VertexBuffer::Map(MapType eMapType)
{
    void* pData = 0;
    if (FAILED(m_pD3DVB->Lock(0,0,&pData, RBD3D9Tools::ComputeD3DMapFlagsFromRB(eMapType, this))))
    {
        return NULL;
    }
    return pData;
}

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
void RBD3D9VertexBuffer::Unmap()
{
    m_pD3DVB->Unlock();
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
void RBD3D9VertexBuffer::OnReset(bool bBeforeReset)
{
    RBAssert(m_uiMemPoolMask & MP_CPU, "Vertex buffers are suposed to be in Managed mem");
    if (bBeforeReset)
    {
        RBCommon::SafeRelease(m_pD3DVB);
    }
    else
    {
        Create();
    }
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBD3D9VertexBuffer::Create()
{
    HRESULT hr = RBD3D9Renderer::GetSingleton()->GetD3DDevice()->CreateVertexBuffer(m_uiVertexSize * m_uiVertexCount, RBD3D9Tools::ComputeD3DUsageFromRB(m_uiUsage), 0, D3DPOOL_DEFAULT, &m_pD3DVB, NULL);
    UNUSED(hr);

    RBAssert(SUCCEEDED(hr), "Something went wrong with Vertex Buffer Creation");

    void* pMappedBuffer = Map(HBM_WRITE_DISCARD);
    memcpy(pMappedBuffer, m_pData, m_uiVertexSize * m_uiVertexCount);
    Unmap();
}

/***********************************************************************************************************/
